﻿#pragma once
#include <set>
#include <utility>
#include <unordered_map>
#include "AstNode.h"
#include "Parameter.h"

#define Interface struct

class AstType;
class AstClass;
class ClassInstanceType;
class FunctionInstance;
class AstPackage;
class AstFunction;
class CodeGen;

Interface MakeContext {
	virtual SiContext* makeContext(SiContext* context, CodeGen* codeGen) = 0;
};

/**
	这里定义了一个上下文
	*/
class SiContext{
public:
	SiContext(SiContext* p);
	SiContext* parent;

	llvm::Function* func() {
		return _func ? _func : parent->func();
	}
	void setFunc(llvm::Function* f) { _func = f; }

	llvm::Value *object = nullptr;
	std::string pathName;
public:
	// 通过变量名称查找变量
	virtual CodeGen* findSymbolValue(const std::string& name, bool recursive = true)=0;

	virtual void defineFunction(const std::string& name, AstFunction*);
	virtual void setSymbolValue(const std::string& name, CodeGen* v)=0;

	void setClass(const std::string& name, AstClass* cls);
	AstClass* findClass(const std::string& name);

	/// <summary>
	/// 通过名称和参数查找函数，如果找到参数将被整理
	/// </summary>
	/// <param name="name">函数名</param>
	/// <param name="arguments">参数表</param>
	/// <returns>函数</returns>
	virtual CodeGen* makeCall(const std::string& name, std::vector<std::pair<std::string, CodeGen*>>& arguments);
protected:
	std::multimap<std::string, AstFunction*> _functions;
	std::unordered_map< std::string, AstClass* > _class;			// 未特例化的自定义结构
	llvm::Function* _func = nullptr;

	std::string makeNameByTypes(const std::vector<Parameter>& ordered);
};
